common.skill

LINQ এ ডেটা প্রজেকশন (Data Projection in LINQ)

Microsoft Technologies - লিংক (LinQ)
183
183

ডেটা প্রজেকশন (Data Projection) হল LINQ-এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যার মাধ্যমে আপনি একটি ডেটা সোর্সের থেকে নির্বাচিত ডেটাকে একটি নতুন ফরম্যাটে বা টাইপে রূপান্তর করতে পারেন। প্রজেকশন দ্বারা আপনি ডেটার কোনো নির্দিষ্ট অংশ বা একটি নতুন অবজেক্ট তৈরি করতে পারেন।

LINQ এ ডেটা প্রজেকশন সাধারণত Select বা SelectMany মেথডের মাধ্যমে করা হয়। Select মেথড ব্যবহার করে আপনি একটি নতুন ফরম্যাটে ডেটা বের করতে পারেন, যেমন একটি নির্দিষ্ট প্রপার্টি, একটি অবজেক্ট, বা একটি কাস্টম ক্লাস।


Select মেথডের মাধ্যমে ডেটা প্রজেকশন

LINQ এর Select মেথড ব্যবহার করে আপনি ডেটাকে প্রজেক্ট বা রূপান্তর করতে পারেন। এটি একটি কোলেকশন থেকে নির্দিষ্ট প্রপার্টি বা তথ্য বের করার জন্য ব্যবহৃত হয়।

Select মেথডের সাধারণ কাঠামো

var result = from item in dataSource
             select new { item.Property1, item.Property2 };

এখানে,

  • item: ডেটাসোর্সের প্রতিটি উপাদান।
  • new { item.Property1, item.Property2 }: একটি নতুন অ্যানোনিমাস অবজেক্ট তৈরি করা, যেখানে আপনি শুধু দরকারি প্রপার্টিগুলি নির্বাচন করেছেন।

উদাহরণ ১: সাধারণ ডেটা প্রজেকশন

List<Customer> customers = new List<Customer>
{
    new Customer { CustomerID = 1, Name = "Alice", City = "New York" },
    new Customer { CustomerID = 2, Name = "Bob", City = "London" },
    new Customer { CustomerID = 3, Name = "Charlie", City = "Paris" }
};

// Select দিয়ে নাম এবং শহর বের করা
var customerNamesAndCities = from c in customers
                             select new { c.Name, c.City };

foreach (var customer in customerNamesAndCities)
{
    Console.WriteLine($"Name: {customer.Name}, City: {customer.City}");
}
// Output:
// Name: Alice, City: New York
// Name: Bob, City: London
// Name: Charlie, City: Paris

এখানে Customer ক্লাসের Name এবং City প্রপার্টি নির্বাচন করা হয়েছে।


উদাহরণ ২: কাস্টম ক্লাসের সাথে ডেটা প্রজেকশন

class CustomerInfo
{
    public string Name { get; set; }
    public string City { get; set; }
}

List<Customer> customers = new List<Customer>
{
    new Customer { CustomerID = 1, Name = "Alice", City = "New York" },
    new Customer { CustomerID = 2, Name = "Bob", City = "London" },
    new Customer { CustomerID = 3, Name = "Charlie", City = "Paris" }
};

// Select দিয়ে কাস্টম ক্লাসের অবজেক্ট তৈরি করা
var customerInfoList = from c in customers
                       select new CustomerInfo { Name = c.Name, City = c.City };

foreach (var customer in customerInfoList)
{
    Console.WriteLine($"Name: {customer.Name}, City: {customer.City}");
}
// Output:
// Name: Alice, City: New York
// Name: Bob, City: London
// Name: Charlie, City: Paris

এখানে CustomerInfo ক্লাসের ইনস্ট্যান্স তৈরি করা হয়েছে এবং তাতে Name এবং City প্রপার্টি ধারণ করা হয়েছে।


SelectMany মেথডের মাধ্যমে ডেটা প্রজেকশন

SelectMany মেথড ব্যবহার করে আপনি Nested Collections বা Collection of Collections থেকে ডেটা প্রজেক্ট করতে পারেন। এটি একটি কোলেকশনের প্রতিটি উপাদান থেকে আরও একটি কোলেকশন বের করে এবং সেগুলিকে একত্রিত করে একটি নতুন ফ্ল্যাট কোলেকশন তৈরি করে।

SelectMany মেথডের সাধারণ কাঠামো

var result = dataSource.SelectMany(item => item.Collection);

এখানে,

  • item.Collection: এটি মূল ডেটার প্রতিটি উপাদান থেকে একটি নতুন কোলেকশন ফেরত দেয়, এবং SelectMany এই কোলেকশনগুলো একত্রিত করে একটি একক ফ্ল্যাট কোলেকশনে পরিণত করে।

উদাহরণ ৩: SelectMany দিয়ে Nested Collection প্রজেকশন

class Customer
{
    public string Name { get; set; }
    public List<string> Orders { get; set; }
}

List<Customer> customers = new List<Customer>
{
    new Customer { Name = "Alice", Orders = new List<string> { "Order1", "Order2" } },
    new Customer { Name = "Bob", Orders = new List<string> { "Order3", "Order4" } },
    new Customer { Name = "Charlie", Orders = new List<string> { "Order5" } }
};

// SelectMany দিয়ে প্রতিটি কাস্টমারের অর্ডার বের করা
var allOrders = customers.SelectMany(c => c.Orders);

foreach (var order in allOrders)
{
    Console.WriteLine(order);
}
// Output:
// Order1
// Order2
// Order3
// Order4
// Order5

এখানে SelectMany ব্যবহার করে Customer ক্লাসের Orders লিস্ট থেকে সমস্ত অর্ডার একত্রিত করা হয়েছে।


LINQ এ Data Projection এর সুবিধা

  • কাস্টম রেজাল্ট তৈরি: আপনি LINQ এর মাধ্যমে যেকোনো ধরনের কাস্টম অবজেক্ট বা অ্যানোনিমাস অবজেক্ট তৈরি করতে পারেন, যা আপনার প্রয়োজনে মানানসই।
  • ফ্ল্যাট কোলেকশন তৈরি: SelectMany ব্যবহার করে আপনি নেস্টেড কোলেকশনগুলোকে একত্রিত করতে পারেন এবং একটি ফ্ল্যাট কোলেকশন পেতে পারেন, যা পরবর্তীতে সহজে প্রক্রিয়া করা যায়।
  • সহজ ফিল্টারিং: প্রজেকশন পদ্ধতি ব্যবহার করে আপনি ডেটার নির্দিষ্ট অংশ বের করতে পারেন, ফলে মেমরি ব্যবহারের সাশ্রয় হয় এবং পারফরম্যান্স উন্নত হয়।

সারাংশ

LINQ এ ডেটা প্রজেকশন একটি শক্তিশালী পদ্ধতি যা ডেটাকে একটি নির্দিষ্ট ফরম্যাটে রূপান্তর করতে সাহায্য করে। Select এবং SelectMany মেথড ব্যবহার করে আপনি কাস্টম অবজেক্ট, অ্যানোনিমাস অবজেক্ট বা একটি একক ফ্ল্যাট কোলেকশন তৈরি করতে পারেন। এটি ডেটা ম্যানিপুলেশনকে আরও সহজ এবং কার্যকরী করে তোলে।

common.content_added_by

Anonymous Types ব্যবহার

189
189

Anonymous Types হল C# এর একটি বৈশিষ্ট্য যা আপনাকে একটি নতুন টাইপ তৈরি করতে দেয়, যার জন্য আপনি কোন ক্লাস বা ডাটাটাইপ পূর্বে ডিফাইন না করেও শুধুমাত্র প্রোপার্টির নাম এবং মান নির্ধারণ করতে পারেন। এই প্রকারের টাইপগুলি সাধারণত LINQ এর মধ্যে ব্যবহৃত হয়, যখন আপনি একটি কুয়েরির মাধ্যমে নির্বাচিত ডেটাকে একটি নির্দিষ্ট আউটপুট ফরম্যাটে ফেরত দিতে চান।

এগুলি মূলত read-only (পড়তে পারা) প্রোপার্টি নিয়ে গঠিত, এবং এগুলি বিশেষভাবে উপকারী যখন আপনি ডেটা ফিল্টার বা নির্বাচনের মাধ্যমে একটি নতুন অস্থায়ী অবজেক্ট তৈরি করতে চান।


Anonymous Types এর বৈশিষ্ট্য

  • ক্লাস তৈরি করার প্রয়োজন নেই: আপনি টাইপের নাম বা ক্লাস ডিফাইন না করেই নতুন প্রোপার্টি সহ অবজেক্ট তৈরি করতে পারেন।
  • পড়তে পারা প্রোপার্টি: Anonymous Types এর সব প্রোপার্টি শুধুমাত্র পড়া যায়, তা পরিবর্তন করা যায় না।
  • নাম স্বয়ংক্রিয়ভাবে নির্ধারণ হয়: আপনি যে প্রোপার্টি নাম দেন, তা স্বয়ংক্রিয়ভাবে ক্লাসের প্রোপার্টি হিসেবে নির্ধারিত হয়ে যায়।

Anonymous Types তৈরি করা

Anonymous Types তৈরি করতে আপনি new কিওয়ার্ড ব্যবহার করেন এবং প্রোপার্টি নাম ও মান নির্ধারণ করেন। এখানে একটি উদাহরণ দেওয়া হল যেখানে একটি LINQ Query ব্যবহার করা হয়েছে:

var student = new 
{
    Name = "John",
    Age = 25,
    Grade = "A"
};

Console.WriteLine($"Name: {student.Name}, Age: {student.Age}, Grade: {student.Grade}");

এখানে, student নামক একটি অ্যানোনিমাস টাইপ তৈরি করা হয়েছে যার তিনটি প্রোপার্টি রয়েছে: Name, Age, এবং Grade। আপনি এতে নতুন টাইপের নাম বা ক্লাস তৈরি করেননি, তবে new কিওয়ার্ড ব্যবহার করে ডাইনামিকভাবে এই টাইপের একটি অবজেক্ট তৈরি করেছেন।


LINQ এর মধ্যে Anonymous Types ব্যবহার

LINQ Query ব্যবহার করার সময়, যদি আপনি কোনও কুয়েরি থেকে নির্দিষ্ট কিছু ডেটা সিলেক্ট করতে চান এবং সেই ডেটাকে একটি নতুন টাইপ হিসেবে ফেরত দিতে চান, তবে আপনি Anonymous Types ব্যবহার করতে পারেন। এখানে একটি উদাহরণ দেওয়া হল:

List<Student> students = new List<Student>
{
    new Student { Name = "John", Age = 22, Grade = "A" },
    new Student { Name = "Anna", Age = 24, Grade = "B" },
    new Student { Name = "Mike", Age = 23, Grade = "A" }
};

var selectedStudents = from student in students
                       where student.Grade == "A"
                       select new
                       {
                           student.Name,
                           student.Age
                       };

foreach (var student in selectedStudents)
{
    Console.WriteLine($"Name: {student.Name}, Age: {student.Age}");
}

এখানে, LINQ Query ব্যবহার করে Grade "A" থাকা ছাত্রদের Name এবং Age নির্বাচন করা হয়েছে এবং সেগুলি একটি Anonymous Type হিসেবে ফেরত দেওয়া হয়েছে। এখানে new কিওয়ার্ড দিয়ে একটি নতুন টাইপ তৈরি করা হয়েছে যা Name এবং Age প্রোপার্টি ধারণ করে।


Anonymous Types এর সুবিধা

  • ক্লাস বা টাইপ তৈরি করার প্রয়োজন হয় না: যদি আপনাকে একবারে কিছু প্রোপার্টি নির্বাচন করতে হয়, তবে আলাদা ক্লাস বা স্ট্রাকচার তৈরির প্রয়োজন পড়ে না।
  • LINQ এর সাথে সহজ ব্যবহার: LINQ Query তে নির্বাচিত ডেটাকে সহজেই একটি আউটপুট টাইপে রূপান্তর করা যায়।
  • ডাইনামিক ফিল্টার এবং ম্যানিপুলেশন: অনেক সময় আপনি কোন স্থির টাইপ বা ক্লাসের প্রয়োজন ছাড়া ডেটার উপর অস্থায়ী পরিবর্তন বা ফিল্টার করতে পারবেন।

Anonymous Types এর সীমাবদ্ধতা

  • read-only: Anonymous Types এ সমস্ত প্রোপার্টি শুধুমাত্র পড়ার জন্য (read-only), এগুলি পরিবর্তন করা যায় না।
  • নাম ব্যবহার: আপনি যখন Anonymous Type তৈরি করেন, তখন টাইপের নাম জানেন না, শুধুমাত্র প্রোপার্টি নাম ব্যবহার করতে পারবেন।
  • নির্দিষ্ট টাইপে রূপান্তর: Anonymous Types অন্য ক্লাস বা টাইপে কনভার্ট করা যায় না, তবে তাদের উপর থেকে কাজ করার জন্য একাধিক প্রোপার্টির তথ্য থাকে।

Anonymous Types এবং Object Initializer এর মধ্যে পার্থক্য

Anonymous Types এবং Object Initializers মাঝে কিছু পার্থক্য রয়েছে:

  • Anonymous Types: এই ধরনের টাইপে একটি নতুন টাইপ তৈরি হয় এবং এটি শুধুমাত্র read-only প্রোপার্টি ধারণ করে।
  • Object Initializer: এই ধরনের টাইপে কোনো নতুন টাইপ তৈরি না হয়ে, ক্লাসের যে কোনো পাবলিক প্রোপার্টি সেট করা হয়।

সমাপ্তি

Anonymous Types ব্যবহার করা খুবই সুবিধাজনক, বিশেষত LINQ কুয়েরি এবং অন্যান্য ডেটা ম্যানিপুলেশন অপারেশনে যখন আপনি অস্থায়ীভাবে ডেটাকে একটি নির্দিষ্ট ফরম্যাটে ফেরত দিতে চান। এটি কোডকে আরও সিম্পল এবং রিডেবল করে তোলে, তবে মনে রাখতে হবে যে, এগুলি read-only এবং প্রপার্টি পরিবর্তন করার সুযোগ নেই।

common.content_added_by

SelectMany এবং Projection

197
197

SelectMany এবং Projection দুটি অত্যন্ত শক্তিশালী কৌশল LINQ (Language Integrated Query)-এ যা ডেটা কুয়েরি এবং ম্যানিপুলেশনের জন্য ব্যবহৃত হয়। তাদের ব্যবহারের ধরন এবং উদ্দেশ্য আলাদা, তবে উভয়ই ডেটা রিট্রাইভ করার পদ্ধতিকে আরও কার্যকর এবং নমনীয় করে তোলে।


SelectMany

SelectMany হল LINQ এর একটি মেথড যা একটি ফ্ল্যাট বা একক লিস্ট বা কালেকশন তৈরি করে, যা ভেতরের কালেকশনের উপাদানগুলিকে একত্রিত করে। এটি বিশেষভাবে ব্যবহার করা হয় যখন কোনো কালেকশন বা লিস্টের মধ্যে আরেকটি কালেকশন থাকে, এবং আপনাকে সেই ভিতরের কালেকশনগুলির উপাদানগুলি একত্রিত করতে হয়।

বিশেষত্ব:

  • Nested Collections থেকে Flattened Collection তৈরি করে।
  • IEnumerable<IEnumerable> বা IQueryable<IQueryable> এর মধ্যে Nested ডেটাকে Single IEnumerable এ রূপান্তর করে।
  • এটি Projection এর সাথে ব্যবহার করা যেতে পারে, যেখানে একটি কালেকশন থেকে তার উপাদান বের করা হয় এবং সেগুলিকে একটি ফ্ল্যাট কালেকশনে পরিণত করা হয়।

SelectMany এর উদাহরণ

ধরা যাক, আমাদের কাছে কিছু ছাত্রের ডেটা এবং তাদের কোর্সের তালিকা রয়েছে। আমরা চাই সমস্ত ছাত্রদের কোর্সগুলো একত্রিত করতে।

var students = new List<Student>
{
    new Student { Name = "John", Courses = new List<string> { "Math", "Science" }},
    new Student { Name = "Jane", Courses = new List<string> { "History", "Art" }},
    new Student { Name = "Bob", Courses = new List<string> { "Physics", "Chemistry" }}
};

// SelectMany ব্যবহার করে সমস্ত কোর্স একত্রিত করা
var allCourses = students.SelectMany(student => student.Courses);

foreach (var course in allCourses)
{
    Console.WriteLine(course);
}

Output:

Math
Science
History
Art
Physics
Chemistry

এখানে SelectMany মেথডটি প্রতিটি ছাত্রের কোর্সগুলিকে একত্রিত করে একটি ফ্ল্যাট লিস্ট তৈরি করেছে। এর ফলে আমরা সমস্ত কোর্সগুলোকে একত্রে দেখতে পারলাম, যেগুলি প্রথমে প্রত্যেক ছাত্রের তালিকায় ছিল।


Projection

Projection হল একটি LINQ কৌশল যা কোনো একটি ডেটা কালেকশন থেকে নির্দিষ্ট অংশ বা ফিল্ড বের করতে ব্যবহৃত হয়। এটি সাধারণত Select মেথডের মাধ্যমে সম্পাদিত হয়, যা কেবলমাত্র নির্দিষ্ট ডেটা রিটার্ন করে (যেমন নির্দিষ্ট প্রপার্টি বা ফিল্ড)। Projection-এর মাধ্যমে আপনি একটি নতুন অবজেক্ট বা মান তৈরি করতে পারেন।

বিশেষত্ব:

  • ডেটার একটি অংশ বা কাস্টম অবজেক্ট রিটার্ন করার জন্য ব্যবহৃত হয়।
  • এটি কোনও নির্দিষ্ট প্রপার্টি, ক্ষেত্র বা ফিল্ড থেকে মান রিটার্ন করে।
  • Lambda Expression ব্যবহার করে Projection সাধারণত একটি নতুন অবজেক্ট তৈরি করতে সহায়ক।

Projection এর উদাহরণ

ধরা যাক, আমাদের কাছে কিছু ছাত্রের ডেটা রয়েছে, এবং আমরা তাদের নাম এবং তাদের প্রথম কোর্সটি বের করতে চাই।

var students = new List<Student>
{
    new Student { Name = "John", Courses = new List<string> { "Math", "Science" }},
    new Student { Name = "Jane", Courses = new List<string> { "History", "Art" }},
    new Student { Name = "Bob", Courses = new List<string> { "Physics", "Chemistry" }}
};

// Projection ব্যবহার করে ছাত্রদের নাম এবং প্রথম কোর্স বের করা
var studentCourses = students.Select(student => new 
{
    Name = student.Name,
    FirstCourse = student.Courses.FirstOrDefault()
});

foreach (var student in studentCourses)
{
    Console.WriteLine($"{student.Name} - {student.FirstCourse}");
}

Output:

John - Math
Jane - History
Bob - Physics

এখানে Projection ব্যবহার করে, Select মেথডটি প্রতিটি ছাত্রের নাম এবং প্রথম কোর্সটি বের করেছে এবং একটি নতুন অ্যানোনিমাস অবজেক্ট তৈরি করেছে যা Name এবং FirstCourse প্রপার্টি ধারণ করে।


SelectMany এবং Projection একসাথে ব্যবহার করা

কখনও কখনও SelectMany এবং Projection একসাথে ব্যবহার করা হয় যখন আপনাকে নেস্টেড কালেকশনের উপাদানগুলি একত্রিত করতে হবে এবং সেগুলিকে একটি নতুন আকারে প্রক্ষেপণ করতে হবে।

উদাহরণ:

ধরা যাক, আমাদের কাছে কিছু ছাত্র এবং তাদের কোর্স রয়েছে, এবং আমরা প্রতিটি ছাত্রের নাম এবং তাদের কোর্সের প্রথম অক্ষর বের করতে চাই।

var students = new List<Student>
{
    new Student { Name = "John", Courses = new List<string> { "Math", "Science" }},
    new Student { Name = "Jane", Courses = new List<string> { "History", "Art" }},
    new Student { Name = "Bob", Courses = new List<string> { "Physics", "Chemistry" }}
};

// SelectMany এবং Projection একসাথে ব্যবহার করা
var studentCourseInitials = students
    .SelectMany(student => student.Courses, (student, course) => new 
    {
        student.Name,
        CourseInitial = course[0]
    });

foreach (var student in studentCourseInitials)
{
    Console.WriteLine($"{student.Name} - {student.CourseInitial}");
}

Output:

John - M
John - S
Jane - H
Jane - A
Bob - P
Bob - C

এখানে SelectMany প্রথমে ছাত্রদের কোর্সগুলিকে একত্রিত করেছে এবং তারপর Projection এর মাধ্যমে CourseInitial হিসেবে কোর্সের প্রথম অক্ষর বের করেছে।


সারাংশ

  • SelectMany হল LINQ-এর একটি শক্তিশালী মেথড যা nested collections থেকে flat collections তৈরি করতে ব্যবহৃত হয়।
  • Projection হল একটি কৌশল যা Select মেথড ব্যবহার করে ডেটার একটি নির্দিষ্ট অংশ বা নতুন অবজেক্ট রিটার্ন করতে সহায়ক।
  • SelectMany এবং Projection একসাথে ব্যবহার করলে আপনি nested collections কে ফ্ল্যাট করে নতুন আকারে প্রক্ষেপণ করতে পারেন।

এটি ডেটা রিট্রাইভাল এবং ম্যানিপুলেশনকে আরও সহজ এবং কার্যকর করে তোলে, বিশেষ করে যখন অনেক স্তরের ডেটা কাজ করতে হয়।

common.content_added_by

Complex Projection এবং Nested Queries

258
258

Complex Projection এবং Nested Queries হল LINQ কুয়েরি লেখার আরও উন্নত কৌশল, যা ডেটার বিভিন্ন দিক এবং সম্পর্কগুলি প্রক্রিয়া করতে সহায়ক। এগুলি বড় ডেটাসেটের মধ্যে প্যাটার্ন বা তথ্য বের করার জন্য শক্তিশালী টুলস হিসেবে কাজ করে। নিচে এগুলোর বিস্তারিত আলোচনা করা হলো।


Complex Projection

Complex Projection হল LINQ কুয়েরি ব্যবহার করে ডেটার বিভিন্ন ফিল্ড বা প্রোপার্টি নির্বাচন করা, যেখানে সাধারণ Select অপারেশন ছাড়াও একাধিক প্রোপার্টি, সাব-অবজেক্ট বা কাস্টম অবজেক্ট ফিরিয়ে আনা হয়। এতে, ডেটার একটি বা একাধিক অংশকে কাস্টম অবজেক্টে রূপান্তরিত করা হয়, যা কমপ্লেক্স ডেটা রিটার্ন করে।

Complex Projection এর উদাহরণ:

ধরা যাক, আমাদের কাছে একটি Customer ক্লাস রয়েছে যা Name, Address এবং Orders ফিল্ড ধারণ করে, যেখানে Orders একটি লিস্ট অব Order অবজেক্ট।

public class Customer
{
    public string Name { get; set; }
    public string Address { get; set; }
    public List<Order> Orders { get; set; }
}

public class Order
{
    public int OrderID { get; set; }
    public DateTime OrderDate { get; set; }
    public decimal TotalAmount { get; set; }
}

এখন, আমরা যদি Customer ক্লাসের Name এবং TotalAmount যোগ করে কাস্টম অবজেক্ট তৈরি করতে চাই, তাহলে Complex Projection ব্যবহার করব।

List<Customer> customers = new List<Customer>
{
    new Customer
    {
        Name = "Alice",
        Address = "New York",
        Orders = new List<Order>
        {
            new Order { OrderID = 1, OrderDate = DateTime.Now, TotalAmount = 100 },
            new Order { OrderID = 2, OrderDate = DateTime.Now.AddDays(-1), TotalAmount = 200 }
        }
    },
    new Customer
    {
        Name = "Bob",
        Address = "Los Angeles",
        Orders = new List<Order>
        {
            new Order { OrderID = 3, OrderDate = DateTime.Now.AddDays(-2), TotalAmount = 150 }
        }
    }
};

// Complex Projection: Customer Name এবং Total Order Amount নির্বাচন করা
var result = from customer in customers
             select new
             {
                 customer.Name,
                 TotalAmount = customer.Orders.Sum(order => order.TotalAmount)
             };

foreach (var item in result)
{
    Console.WriteLine($"{item.Name}: {item.TotalAmount}");
}

এখানে Select এর মাধ্যমে আমরা Name এবং Orders এর TotalAmount এর যোগফলকে কাস্টম অবজেক্ট হিসেবে ফিরিয়ে দিয়েছি। এই কুয়েরি ফলস্বরূপ:

Alice: 300
Bob: 150

এটি Complex Projection এর একটি সহজ উদাহরণ, যেখানে Order অবজেক্টের মান ব্যবহার করে একটি নতুন প্রোপার্টি তৈরি করা হয়েছে।


Nested Queries

Nested Queries হল এমন LINQ কুয়েরি যেখানে একটি কুয়েরি অন্য একটি কুয়েরির মধ্যে থাকে। সাধারণত, এক বা একাধিক কুয়েরি সাবকুয়েরি হিসেবে ব্যবহার করা হয়, যা প্রধান কুয়েরির ফলাফল তৈরি করতে সাহায্য করে। এটি সাধারণত যখন প্রয়োজন হয় ডেটার মধ্যে সম্পর্কের ভিত্তিতে নতুন ফলাফল তৈরি করতে, তখন ব্যবহার করা হয়।

Nested Queries এর উদাহরণ:

ধরা যাক, আমাদের কাছে Order এবং Product ক্লাস আছে, যেখানে প্রতিটি Order এর মধ্যে একাধিক Product থাকে। আমরা যদি এমন একটি কুয়েরি তৈরি করতে চাই, যা Customer অনুযায়ী প্রতিটি Order এর জন্য সর্বোচ্চ মোট অর্ডার মূল্য বের করবে, তাহলে Nested Query ব্যবহার করতে হবে।

public class Order
{
    public int OrderID { get; set; }
    public string CustomerName { get; set; }
    public List<Product> Products { get; set; }
}

public class Product
{
    public string ProductName { get; set; }
    public decimal Price { get; set; }
}

List<Order> orders = new List<Order>
{
    new Order
    {
        OrderID = 1,
        CustomerName = "Alice",
        Products = new List<Product>
        {
            new Product { ProductName = "Laptop", Price = 1000 },
            new Product { ProductName = "Mouse", Price = 50 }
        }
    },
    new Order
    {
        OrderID = 2,
        CustomerName = "Bob",
        Products = new List<Product>
        {
            new Product { ProductName = "Keyboard", Price = 75 },
            new Product { ProductName = "Monitor", Price = 300 }
        }
    },
    new Order
    {
        OrderID = 3,
        CustomerName = "Alice",
        Products = new List<Product>
        {
            new Product { ProductName = "Phone", Price = 500 },
            new Product { ProductName = "Headphones", Price = 100 }
        }
    }
};

// Nested Query: প্রতিটি Order এর জন্য সর্বোচ্চ মূল্য বের করা
var result = from order in orders
             group order by order.CustomerName into customerGroup
             select new
             {
                 Customer = customerGroup.Key,
                 MaxOrderAmount = (from product in customerGroup.SelectMany(order => order.Products)
                                   select product.Price).Max()
             };

foreach (var item in result)
{
    Console.WriteLine($"{item.Customer}: {item.MaxOrderAmount}");
}

এখানে Nested Query এর মধ্যে SelectMany() এবং একটি সাব-কুয়েরি ব্যবহার করা হয়েছে, যা Products থেকে সর্বোচ্চ Price বের করে। এই কুয়েরি ফলস্বরূপ:

Alice: 1000
Bob: 300

এটি একটি Nested Query এর উদাহরণ যেখানে এক কুয়েরি অন্য কুয়েরির ভিতরে ব্যবহার করা হয়েছে, এবং ডেটার একটি অংশকে আরও নির্দিষ্টভাবে প্রক্রিয়া করা হয়েছে।


সারাংশ

  • Complex Projection হল LINQ-এর মাধ্যমে ডেটা পরিবর্তন করে একটি নতুন অবজেক্ট তৈরি করার প্রক্রিয়া। এটি Select অপারেটরের মাধ্যমে একাধিক প্রোপার্টি বা সাব-অবজেক্টকে কাস্টম অবজেক্টে রূপান্তর করতে সহায়ক।
  • Nested Queries হল LINQ কুয়েরির মধ্যে অন্য কুয়েরি ব্যবহার করা, যা ডেটাবেসের মধ্যে সম্পর্কিত তথ্য প্রক্রিয়া করতে ব্যবহৃত হয়। এটি Subquery হিসেবে পরিচিত এবং সাধারণত জটিল সম্পর্কিত ডেটা বের করার জন্য ব্যবহৃত হয়।
common.content_added_by

ফিল্টারিং এবং প্রজেকশন একত্রে ব্যবহার

172
172

LINQ (Language Integrated Query) ব্যবহার করার সময়, আপনি ফিল্টারিং এবং প্রজেকশন একত্রে ব্যবহার করে আরও কার্যকরী এবং জটিল কুয়েরি তৈরি করতে পারেন।

  • ফিল্টারিং (Filtering) হল ডেটাসেট থেকে নির্দিষ্ট শর্তের ভিত্তিতে তথ্য নির্বাচন করা। LINQ এ এটি সাধারণত where ক্লজের মাধ্যমে করা হয়।
  • প্রজেকশন (Projection) হল ডেটার নির্দিষ্ট অংশ নির্বাচন বা পরিবর্তন করা, যেমন কোনো অবজেক্টের কিছু ফিল্ড নির্বাচন করা বা নতুন অবজেক্ট তৈরি করা।

এই দুটি কৌশল একত্রে ব্যবহার করলে, আপনি একটি ডেটাসেট থেকে নির্দিষ্ট শর্ত পূরণকারী তথ্য নির্বাচন করতে পারবেন এবং সেই তথ্যের কিছু অংশ বা রূপান্তরিত সংস্করণ প্রদর্শন করতে পারবেন।


ফিল্টারিং এবং প্রজেকশন একত্রে ব্যবহার

LINQ এর where ক্লজ এবং select ক্লজ ব্যবহার করে ফিল্টারিং এবং প্রজেকশন একত্রে করা যায়। নিচে একটি উদাহরণ দেয়া হল যেখানে একটি লিস্ট থেকে even numbers ফিল্টার করা হয়েছে এবং তারপর তাদের স্কয়ার (square) নেয়া হয়েছে।

উদাহরণ:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

// Filter (even numbers) এবং Projection (square) একত্রে ব্যবহার
var result = from num in numbers
             where num % 2 == 0          // ফিল্টারিং: even numbers
             select num * num;          // প্রজেকশন: স্কয়ার

foreach (var square in result)
{
    Console.WriteLine(square);  // Output: 4, 16, 36, 64, 100
}

এখানে:

  • where num % 2 == 0 শর্তটি ফিল্টারিং করতে ব্যবহৃত হয়েছে, যার মাধ্যমে শুধুমাত্র even numbers নির্বাচন করা হয়েছে।
  • select num * num হল প্রজেকশন, যা নির্বাচন করা সংখ্যাগুলোর স্কয়ার বের করছে।

আরও জটিল উদাহরণ: অবজেক্টের ফিল্টারিং এবং প্রজেকশন

ধরা যাক, আমাদের কাছে একটি Employee ক্লাস আছে এবং আমরা একটি তালিকা থেকে age 30 এর বেশি এমন কর্মীদের নাম এবং বয়স বের করতে চাই।

উদাহরণ:

public class Employee
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Position { get; set; }
}

List<Employee> employees = new List<Employee>
{
    new Employee { Name = "Alice", Age = 35, Position = "Manager" },
    new Employee { Name = "Bob", Age = 28, Position = "Developer" },
    new Employee { Name = "Charlie", Age = 42, Position = "CEO" },
    new Employee { Name = "David", Age = 25, Position = "Intern" },
};

// Filter (age > 30) এবং Projection (Name এবং Age) একত্রে ব্যবহার
var result = from emp in employees
             where emp.Age > 30            // ফিল্টারিং: age > 30
             select new { emp.Name, emp.Age };  // প্রজেকশন: Name এবং Age

foreach (var emp in result)
{
    Console.WriteLine($"Name: {emp.Name}, Age: {emp.Age}");
}

এখানে:

  • where emp.Age > 30 শর্তটি ফিল্টারিং করতে ব্যবহৃত হয়েছে, যার মাধ্যমে শুধুমাত্র 30 এর বেশি বয়সের কর্মী নির্বাচন করা হয়েছে।
  • select new { emp.Name, emp.Age } হল প্রজেকশন, যা শুধুমাত্র কর্মীর নাম এবং বয়স রিটার্ন করছে।

আউটপুট:

Name: Alice, Age: 35
Name: Charlie, Age: 42

একাধিক শর্তে ফিল্টারিং এবং প্রজেকশন

আপনি একাধিক শর্তও যোগ করতে পারেন, যেমন কর্মীর বয়স 30 এর বেশি হতে হবে এবং তার পদের নাম Manager অথবা CEO হতে হবে। এক্ষেত্রে ফিল্টারিং এবং প্রজেকশন একত্রে ব্যবহার করা হবে।

উদাহরণ:

var result = from emp in employees
             where emp.Age > 30 && (emp.Position == "Manager" || emp.Position == "CEO")  // একাধিক শর্ত
             select new { emp.Name, emp.Age, emp.Position };

foreach (var emp in result)
{
    Console.WriteLine($"Name: {emp.Name}, Age: {emp.Age}, Position: {emp.Position}");
}

আউটপুট:

Name: Alice, Age: 35, Position: Manager
Name: Charlie, Age: 42, Position: CEO

এখানে:

  • where emp.Age > 30 && (emp.Position == "Manager" || emp.Position == "CEO") একাধিক শর্তে ফিল্টারিং করা হয়েছে।
  • select new { emp.Name, emp.Age, emp.Position } দ্বারা প্রজেকশন করা হয়েছে, যাতে কর্মীর নাম, বয়স এবং পদের নাম রিটার্ন করা হয়।

সারাংশ

LINQ এ ফিল্টারিং এবং প্রজেকশন একত্রে ব্যবহার করা ডেটা কুয়েরি করার একটি শক্তিশালী উপায়। ফিল্টারিং (যেমন where ক্লজ ব্যবহার করে) আপনাকে নির্দিষ্ট শর্তে ডেটা নির্বাচন করতে সাহায্য করে, এবং প্রজেকশন (যেমন select ক্লজ ব্যবহার করে) আপনাকে ডেটার নির্দিষ্ট অংশ বা রূপান্তরিত ডেটা প্রাপ্ত করতে সহায়তা করে। একত্রে এই দুটি কৌশল ব্যবহার করলে, আপনি খুবই কার্যকরী এবং শক্তিশালী ডেটা কুয়েরি তৈরি করতে পারবেন।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion